package ar.edu.caece.compiler.grammar.factories;

import ar.edu.caece.compiler.error.ParsingException;
import ar.edu.caece.compiler.grammar.AbstractTokenVisitorFactory;
import ar.edu.caece.compiler.grammar.Recognizer;
import ar.edu.caece.compiler.grammar.TokenRecognizer;
import ar.edu.caece.compiler.grammar.TokenVisitor;
import ar.edu.caece.compiler.grammar.attributes.Attribute;
import ar.edu.caece.compiler.grammar.attributes.StringAttribute;
import ar.edu.caece.compiler.grammar.attributes.Attribute.Type;
import ar.edu.caece.compiler.grammar.attributes.tree.NodeValor;
import ar.edu.caece.compiler.grammar.nonterminals.VALOR1;
import ar.edu.caece.compiler.grammar.terminals.NNaturalToken;

public class VALOR1Factory extends AbstractTokenVisitorFactory {

	private static VALOR1Factory INSTANCE;
	
	public static VALOR1Factory getInstance() {
		if(INSTANCE==null) INSTANCE = new VALOR1Factory();
		return INSTANCE;
	}
	
	private VALOR1Factory() {
		
	}
	
	@Override
	public TokenVisitor makeChainedVisitor(
			final TokenVisitor siguiente) throws Exception {
		return new NNaturalToken.NNaturalChainVisitor(siguiente) {
			
			@Override
			public Recognizer nNaturalCase(NNaturalToken llamador) {
				VALOR1 valor1 = new VALOR1(llamador);
				valor1.addAttribute("tipo", new StringAttribute("NATURAL"));
				valor1.addAttribute("valor", new StringAttribute(llamador.getRepresentation()));

				valor1.addAttribute(Attribute.ARBOL_SINTETIZADO, new NodeValor(Type.NATURAL,llamador.getRepresentation()));
				return valor1;
			}
		};
	
	}
	@Override
	public TokenVisitor makeVisitor() throws Exception {
		return new NNaturalToken.NNaturalTokenVisitor() {
			
			@Override
			public Recognizer defaultCase(TokenRecognizer llamador) throws Exception {
				throw new ParsingException("Error de parsing.",VALOR1.class,llamador);
			}
			
			@Override
			public Recognizer nNaturalCase(NNaturalToken llamador) {
				VALOR1 valor1 = new VALOR1(llamador);
				valor1.addAttribute("tipo", new StringAttribute("NATURAL"));
				valor1.addAttribute("valor", new StringAttribute(llamador.getRepresentation()));
				
				valor1.addAttribute(Attribute.ARBOL_SINTETIZADO, new NodeValor(Type.NATURAL,llamador.getRepresentation()));
				return valor1;
			}
		};
	}
	
	
}
